工厂模式
2016-03-20 22:45
423 查看
工厂模式分为三种模式,分别为:
简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)
工厂方法(Factory Method)模式:又称多态性工厂模式(Polymorphic Factory Pattern)或虚拟构造子模式(Virtual Construct Pattern)
抽象工厂(Abstract Factory)模式:又称工具箱模式(Kit或Tookit)
下面就分别介绍一下这三种设计模式:
简单工厂模式(Simple Factory):
简单工厂模式就是由一个工厂类根据传入的参数量,来决定创建哪一种产品类的实例。(仔细理解这句话,非常重要)
结构图:
![](http://images2015.cnblogs.com/blog/671549/201603/671549-20160320214838474-467000112.png)
上图涉及三个类:
工厂类(Creator):担任工厂模式的核心。工厂类在客户端的调用下直接创建对象,它往往由一个具体类java类实现。
抽象产品类(Product):具体产品类的接口或抽象类。
具体产品类(ConcreteProduct):工厂方法模式所创建的任何角色都是这个角色的实例
源代码实例:
抽象产品类(Product):
Product.java:
具体产品类(ConcreteProduct):
ConcreteProductA.java:
ConcreteProductB.java:
工厂类(Creator):
Creator.java:
客户端:
输出:
2、工厂方法模式(Factory Method)
工厂方法模式中核心工厂类变为一个抽象类,仅负责给出具体工厂子类必须实现的接口,不再接触哪一个产品类被实例化这种细节。
![](http://images2015.cnblogs.com/blog/671549/201603/671549-20160320221236162-436106657.png)
结构中成员类和上面差不多,:
抽象工厂类(Creator):为所有具体工厂类提供接口。
具体工厂类(ConcreteCreator):担任这个角色是实现了抽象工厂接口的具体java类,并且受到应用程序的调用来创建产品。
抽象产品(Product)
具体产品(ConcreteProduct)
抽象方法将某一个产品和一个工厂进行了绑定,这是他与另外两个工厂模式的区别。下面注意看代码:源代码:
抽象产品(Product):
具体产品(ConcreteProduct)类:
ConcreProductA.java:
ConcreProductB.java:
抽象工厂类(Creator):
Creator.java:
具体工厂类(ConcreteCreator):
ConcreteCreatorA.java:
ConcreteCreatorB.java:
客户端:
输出:
3、抽象工厂模式(Abstract Factory)
抽象工厂模式是对象的创建模式,他是工厂方法模式的进一步扩展。使用抽象工厂模式,可以创建来自不同工厂的各种产品。
![](http://images2015.cnblogs.com/blog/671549/201603/671549-20160320223222724-830929217.png)
结构图中的角色:
抽象工厂类(Creator)
具体工厂类(ConcreteCreator)
抽象产品(Product)
具体产品(ConcreteProduct)
源代码:
抽象产品类(Product):
ProductA.java
ProductB.java
具体产品类(ConcreteProduct):
ProductA1.java
productA2.java、productB1.java、productB2.java与上类似,不在列出。
抽象工厂类(Creator):
Creator.java
具体工厂类(ConcreteCreator):
ConcreteCreator1.java
ConcreteCreator2.java
客户端:
输出:
简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)
工厂方法(Factory Method)模式:又称多态性工厂模式(Polymorphic Factory Pattern)或虚拟构造子模式(Virtual Construct Pattern)
抽象工厂(Abstract Factory)模式:又称工具箱模式(Kit或Tookit)
下面就分别介绍一下这三种设计模式:
简单工厂模式(Simple Factory):
简单工厂模式就是由一个工厂类根据传入的参数量,来决定创建哪一种产品类的实例。(仔细理解这句话,非常重要)
结构图:
![](http://images2015.cnblogs.com/blog/671549/201603/671549-20160320214838474-467000112.png)
上图涉及三个类:
工厂类(Creator):担任工厂模式的核心。工厂类在客户端的调用下直接创建对象,它往往由一个具体类java类实现。
抽象产品类(Product):具体产品类的接口或抽象类。
具体产品类(ConcreteProduct):工厂方法模式所创建的任何角色都是这个角色的实例
源代码实例:
抽象产品类(Product):
Product.java:
public interface Product { }
具体产品类(ConcreteProduct):
ConcreteProductA.java:
public class ConcreteProductA implements Product{ public ConcreteProductA(){ System.out.println("具体产品类A"); } }
ConcreteProductB.java:
public class ConcreteProductB implements Product{ public ConcreteProductB(){ System.out.println("具体产品类B"); } }
工厂类(Creator):
Creator.java:
public class Creator { public static Product factory(String which){ if (which.equalsIgnoreCase("ConcreteProductA")) { return new ConcreteProductA(); }else if (which.equalsIgnoreCase("ConcreteProductB")) { return new ConcreteProductB(); }else { return null; } } }
客户端:
public class Client { public static void main(String[] args){ Creator creator = new Creator(); creator.factory("ConcreteProductB"); creator.factory("ConcreteProductA"); } }
输出:
具体产品类B 具体产品类A
2、工厂方法模式(Factory Method)
工厂方法模式中核心工厂类变为一个抽象类,仅负责给出具体工厂子类必须实现的接口,不再接触哪一个产品类被实例化这种细节。
![](http://images2015.cnblogs.com/blog/671549/201603/671549-20160320221236162-436106657.png)
结构中成员类和上面差不多,:
抽象工厂类(Creator):为所有具体工厂类提供接口。
具体工厂类(ConcreteCreator):担任这个角色是实现了抽象工厂接口的具体java类,并且受到应用程序的调用来创建产品。
抽象产品(Product)
具体产品(ConcreteProduct)
抽象方法将某一个产品和一个工厂进行了绑定,这是他与另外两个工厂模式的区别。下面注意看代码:源代码:
抽象产品(Product):
public interface Product { }
具体产品(ConcreteProduct)类:
ConcreProductA.java:
public class ConcreteProductA implements Product{ public ConcreteProductA(){ System.out.println("具体产品类A"); } }
ConcreProductB.java:
public class ConcreteProductB implements Product{ public ConcreteProductB(){ System.out.println("具体产品类B"); } }
抽象工厂类(Creator):
Creator.java:
public interface Creator { public Product factory(); }
具体工厂类(ConcreteCreator):
ConcreteCreatorA.java:
public class ConcreteCreatorA implements Creator{ @Override public Product factory() { return new ConcreteProductA(); } }
ConcreteCreatorB.java:
public class ConcreteCreatorB implements Creator{ @Override public Product factory() { return new ConcreteProductB(); } }
客户端:
public class Client { public static void main(String[] args){ Creator creatorA = new ConcreteCreatorA(); creatorA.factory(); Creator creatorB = new ConcreteCreatorB(); creatorB.factory(); } }
输出:
具体产品类A 具体产品类B
3、抽象工厂模式(Abstract Factory)
抽象工厂模式是对象的创建模式,他是工厂方法模式的进一步扩展。使用抽象工厂模式,可以创建来自不同工厂的各种产品。
![](http://images2015.cnblogs.com/blog/671549/201603/671549-20160320223222724-830929217.png)
结构图中的角色:
抽象工厂类(Creator)
具体工厂类(ConcreteCreator)
抽象产品(Product)
具体产品(ConcreteProduct)
源代码:
抽象产品类(Product):
ProductA.java
public interface ProductA { }
ProductB.java
public interface ProductB { }
具体产品类(ConcreteProduct):
ProductA1.java
public class ProductA1 implements ProductA{ public ProductA1(){ System.out.println("具体产品A1"); } }
productA2.java、productB1.java、productB2.java与上类似,不在列出。
抽象工厂类(Creator):
Creator.java
public interface Creator { public ProductA factoryA(); public ProductB factoryB(); }
具体工厂类(ConcreteCreator):
ConcreteCreator1.java
public class ConcretCreator1 implements Creator{ public ConcretCreator1(){ System.out.println("具体工厂1:"); } public ProductA factoryA(){ return new ProductA1(); } public ProductB factoryB(){ return new ProductB1(); } }
ConcreteCreator2.java
public class ConcretCreator2 implements Creator{ public ConcretCreator2(){ System.out.println("具体工厂2:"); } public ProductA factoryA() { return new ProductA2(); } public ProductB factoryB() { return new ProductB2(); } }
客户端:
public class client { public static void main(String[] args){ //抽象工厂1 Creator creator1 = new ConcretCreator1(); creator1.factoryA(); creator1.factoryB(); Creator creator2 = new ConcretCreator2(); creator2.factoryA(); creator2.factoryB(); } }
输出:
具体工厂1: 具体产品A1 具体产品B1 具体工厂2: 具体产品A2 具体产品B2
相关文章推荐
- WinServer-IIS初始安装及发布网站
- php:格式化字符串
- APP的启动
- [BZOJ1861]书架 做题笔记
- 104.全排列(深搜)搜索与回溯
- java做图表的JFreeChart的使用
- Erlang 游戏开发经验总结
- UIScrollView的滑动视图切换(懒加载)
- 基于Netty开发水利通信软件
- 公约数和公倍数【nyoj40】
- 问题 G: C语言习题 医生值班
- U-boot的环境变量: bootcmd 和bootargs
- php 数组2
- 猎豹MFC--第一个MFC程序设计(不用向导)
- ext.js打印出提示弹窗(鼓捣了两天终于尼玛出来了)
- ASP.NET-服务器客户端的信息保持
- 安卓第十六天笔记-音频与视频播放
- 《学会提问》读书笔记——第二章
- Redis安装包安装流程及学习总结
- php效率高写法