前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java经典23种设计模式之创造型模式(一)

Java经典23种设计模式之创造型模式(一)

作者头像
全栈程序员站长
发布2022-07-07 19:36:52
3560
发布2022-07-07 19:36:52
举报

大家好,又见面了,我是全栈君。

设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过。故此次在这里总结下。值得一提的是,设计模式并不是Java所特有。由于一直搞Android。这里就用Java为载体。最经典的设计模式有23种,分三个大类型: 创建型模式(5) 、结构型模式(7)、行为型模式(11),5 + 7 +11 = 23.网上一搜也都是一大把了,这里不过个人作的记录。本文记录创造型模式里的工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例模式这三种。力求透彻。

一、工厂方法

工厂方法牵涉到四个概念,为了通俗理解,先借用网上一个样例。男的带女的去肯德基吃饭,男的首先说要汉堡。详细啥汉堡让MM来说。个人认为这个样例不是非常恰当,easy让人造成误解。最简单的样例,就是有非常多个工厂。每个工厂都能生产特定的产品。为了清晰理解。还是结合Java设计模式(疯狂Java联盟版)来介绍。

1、Product 即产品,是个接口,详细干啥没说。

public interface Work { void doWork(); }

2、ConcreteProduct。详细的产品。即实现了上面共同的work接口,可是做不同的事。做相同事情的当然就是一个类的概念了。

public class StudentWork implements Work { public void doWork() { System.out.println(“学生*作业!”); } }

public class TeacherWork implements Work { public void doWork() { System.out.println(“老师审批作业!”); } }

这里定义了两个详细的产品。学生的工作就是作业,老师的工作就是审批作业。

3、Creator,创造器。与上面的Product相应。Creator的目的就是获得Product。获得产品。

public interface IWorkFactory { Work getWork(); }

4、ConcreteCreator。详细的创造器。

创造器获得Work。那么全部的详细的产品都满足要求。对每个产品都封装到一个工厂里。

public class StudentWorkFactory implements IWorkFactory {

public Work getWork() { return new StudentWork(); }

}

public class TeacherWorkFactory implements IWorkFactory {

public Work getWork() { return new TeacherWork(); }

}

測试代码例如以下:

public class Test {

public static void main(String[] args) { IWorkFactory studentWorkFactory = new StudentWorkFactory(); studentWorkFactory.getWork().doWork(); IWorkFactory teacherWorkFactory = new TeacherWorkFactory(); teacherWorkFactory.getWork().doWork(); }

} 适用性:

1.当一个类不知道它所必须创建的对象的类的时候。

2.当一个类希望由它的子类来指定它所创建的对象的时候。

3.当想将创建对象的职责托付给多个帮助类中的某一个。而且希望将哪一个帮助子类是代理者这一信息局部化的时候。

二、抽象工厂

有了上面的样例就非常好理解抽象工厂了。

举个样例,去商店买东西,商店就是Factory,你要啥直接说。店员就给你拿啥。

结合上面的样例,定义一个WorkFactory实现IWorkFactory接口。在WorkFactory里传进去一个參数,依据參数推断是new一个StudentWork还是TeacherWork,然后return。这就是抽象工厂。

这是最简单、直白的理解。为了清晰理解。以下再附一个复杂的样例。

1、AbstractProduct 抽象产品

public interface ICat { void eat(); }

public interface IDog {

void eat(); }

2、ConcreteProduct 详细产品

public class BlackCat implements ICat { public void eat() { System.out.println(“The black cat is eating!”); } }

public class WhiteCat implements ICat {

public void eat() { Sy*tem.out.prin*ln(“The w*ite cat is eating!*); } }

public class BlackDog implements IDog {

public void eat() { System.out.println(“The black dog is eating”); }

}

public class WhiteDog implements IDog {

public void eat() { System.out.println(“The white dog is eat*ng!”); }

}

3、AbstractFactory 抽象的工厂,接口。

public interface IAnimalFactory {

ICat createCat(); IDog createDog(); }

4、

ConcreteFactory 详细的工厂,实现上面的接口.

public class BlackAnimalFactory implements IAnimalFactory {

public ICat createCat() { return new BlackCat(); }

public IDog createDog() { return new BlackDog(); }

}

public class WhiteAnimalFactory imp*ements IAnimalFactory {

public ICat createCat() { return new WhiteCat(); }

public IDog createDog() { return new WhiteDog(); }

}

測试代码:

public static void main(String[] args) { IAnimalFactory blackAnimalFactory = new BlackAnimalFactory(); ICat blackCat = blackAnimalFactory.createCat(); blackCat.eat(); IDog blackDog = blackAnimalFactory.createDog(); blackDog.eat(); IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory(); ICat whiteCat = whiteAnimalFactory.createCat(); whiteCat.eat(); IDog whiteDog = whiteAnimalFactory.createDog(); whiteDog.eat(); }

注:能够看到这个复杂的样例就用interface来表述了工厂依据不同的须要创造不同的产品,而简单的样例是传參数确定不同的产品。

使用场合:

1.一个系统要独立于它的产品的创建、组合和表示时。 2.一个系统要由多个产品系列中的一个来配置时。 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时* 4当你提供一个产品类库,而只想显示它们的接口而不是实现时。

三、单例模式

这样的模式用的比較多,參见博文对此说的非常明确了,我就不重述了。

要点:

1就是为了线程调用的安全性。加上同步锁。为了效率使用双重锁定。

2、除了这样的经典的单例外还有其它单例模式。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116360.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、工厂方法
  • 二、抽象工厂
  • 三、单例模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档