工厂设计模式 factory
来源:互联网 发布:偏偏喜欢你淘宝续 编辑:程序博客网 时间:2024/04/20 00:13
设计模式(一)--静态工厂模式
静态工厂模式(static factory)也叫简单工厂模式。
涉及到3个角色:工厂类角色,抽象产品类角色和具体产品类角色。
抽象产品类可以使用接口或者父类来描述产品对象的行为特征。
具体产品类就是某一具体的对象。
静态工厂类有一个静态的方法,含有判断逻辑,决定要创建哪一种具体的产品对象。
其设计模式如下:
抽象产品类 IProduct
- package org.test.design.sf;
- public interface IProduct {
- void work();
- }
- package org.test.design.sf;
- public class ProductA implements IProduct {
- public void work() {
- System.out.println("Here is ProductA, for your dedicated service.");
- }
- }
- package org.test.design.sf;
- public class ProductB implements IProduct {
- public void work() {
- System.out.println("Here is ProductB, for your dedicated service.");
- }
- }
工厂类 ProductFactory
- package org.test.design.sf;
- /**
- * 静态工厂模式
- * @author lushuaiyin
- *
- */
- public class ProductFactory {
- public static IProduct product=null;//静态
- //静态方法
- public static IProduct getProduct(String productType) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
- // if(productType==null||productType.trim().equals("")){//默认创建ProductA
- // product=new ProductA();
- // }else if(productType.trim().equals("ProductA")){
- // product=new ProductA();
- // }else if(productType.trim().equals("ProductB")){
- // product=new ProductB();
- // }
- //静态工厂一般使用类的反射来构建对象,像上面的构建也可以。
- if(productType.trim().equals("ProductA")){
- product=(IProduct)Class.forName("org.test.design.sf.ProductA").newInstance();
- }else if(productType.trim().equals("ProductB")){
- product=(IProduct)Class.forName("org.test.design.sf.ProductB").newInstance();
- }
- return product;
- }
- }
测试:
- package org.test.design.sf;
- public class TestMain {
- /**
- * @param args
- * @throws ClassNotFoundException
- * @throws IllegalAccessException
- * @throws InstantiationException
- */
- public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
- IProduct product_a=ProductFactory.getProduct("ProductA");
- product_a.work();
- IProduct product_b=ProductFactory.getProduct("ProductB");
- product_b.work();
- }
- }
- /*打印
- Here is ProductA, for your dedicated service.
- Here is ProductB, for your dedicated service.
- */
这种模式的优点就是,工厂类负责所有产品对象的创建,客户端在
需要创建对象时,告诉工厂需要哪种类型,工厂就负责创建。
缺点:把所有类型的对象集中在一种工厂创建。当产品对象在以后出现
新的类型以及类型结构变得复杂,这个工厂就会显得简单混乱。
比如,一个生产自行车的工厂,它会生产各种自行车,男士女士的等等。
随着工厂发展壮大,它收购了电视工厂。这时候,工厂还是叫自行车制造厂。
但是生产电视。也就是在工厂类中加入了新的产品类型:电视。
这样的工厂也能正常运转,但是结构显得简单,功能混乱。
同时使用静态方法,也无法实现子类继承。
解决这样的问题就涉及到另一种稍显复杂的模式:工厂模式。
设计模式(二)---工厂模式
工厂模式(factory)
涉及到4个角色:抽象工厂类角色,具体工厂类角色,抽象产品类角色和具体产品类角色。
抽象工厂类角色使用接口或者父类来描述工厂的行为,
具体工厂类角色负责创建某一类型的产品对象。
抽象产品类可以使用接口或者父类来描述产品对象的行为特征。
具体产品类就是某一具体的对象。
工厂模式不同于静态工厂模式的地方:
工厂模式在工厂类也实现了多态,而不仅仅是在产品对象上实现多态。
它可以应对不同类型的产品对应一种具体的工厂。
其设计模式如下:
抽象工厂类 IFactory
- package org.test.design.f;
- /**
- *
- * @author lushuaiyin
- *
- */
- public interface IFactory {
- IProduct createProduct();
- }
具体工厂类 CarFactory ComputerFactory
- package org.test.design.f;
- public class CarFactory implements IFactory {
- public IProduct createProduct() {
- return new Car();
- }
- }
- package org.test.design.f;
- public class ComputerFactory implements IFactory {
- public IProduct createProduct() {
- return new Computer();
- }
- }
抽象产品类 IProduct
- package org.test.design.f;
- public interface IProduct {
- void work();
- }
具体产品类 Car Computer
- package org.test.design.f;
- public class Car implements IProduct{
- public void work() {
- System.out.println("I am car.");
- }
- }
- package org.test.design.f;
- public class Computer implements IProduct{
- public void work() {
- System.out.println("I am Computer.");
- }
- }
测试:
- package org.test.design.f;
- public class TestMain {
- /**
- * @param args
- */
- public static void main(String[] args) {
- IFactory carFactory=new CarFactory();
- IProduct car=(IProduct)carFactory.createProduct();
- car.work();
- IFactory pcFactory=new ComputerFactory();
- IProduct pc=(IProduct)pcFactory.createProduct();
- pc.work();
- }
- }
- /*打印
- I am car.
- I am Computer.
- */
具体工厂类:生产创建某一类具体产品对象。
抽象产品类可以使用接口或者父类来描述产品对象的行为特征。
具体产品类就是某一具体的对象。
那么抽象工厂模式和工厂模式的不同之处呢?
其实最大的不同就在于,在产品类的结构更加复杂时,抽象工厂模式针对不同
的产品族(就是一类产品对象)定义了不同的行为,也就是在父类或接口中,定义了不同
的产生方法。不同的产品族调用各自的创建方法。同时不同的产品族横向比较,也有可
归类的相同特征,这些特征就具体到某一个工厂中体现了。
例如苹果公司生产手机和平板电脑。
这明显是2个不同的产品族。手机和平板电脑就不是同一类产品。
所以在工厂中定义工厂的行为时,就需要为这两种产品族各自设计一个创建方法。
而具体到某一个工厂,它都会生产这两种产品,这两种产品横向比较其实还有共同点,
那就是某一时间段的苹果工厂生产的型号是有规律的,所以2011年的工厂就不会产生iphone5
这个产品对象(因为那时候还没有iphone5)
和工厂模式比,抽象工厂模式其实更加复杂化了,当产品族只有一个时,自然而然
就退化到使用工厂模式了。
设计模式:
抽象工厂类 IAppleFactroy
- package org.test.design.abf;
- /**
- *
- * @author lushuaiyin
- *
- */
- public interface IAppleFactroy {
- IComputer createComputer();
- IMobile createMobile();
- }
具体工厂类 AppleFactoryIn2011 AppleFactoryIn2012
- package org.test.design.abf;
- /**
- *
- * @author lushuaiyin
- *
- */
- public class AppleFactoryIn2011 implements IAppleFactroy{
- public IComputer createComputer() {
- return new Pad3();
- }
- public IMobile createMobile() {
- return new Phone4s();
- }
- }
- package org.test.design.abf;
- /**
- *
- * @author lushuaiyin
- *
- */
- public class AppleFactoryIn2012 implements IAppleFactroy{
- public IComputer createComputer() {
- return new PadMini();
- }
- public IMobile createMobile() {
- return new Phone5();
- }
- }
抽象产品类 IMobile IComputer
- package org.test.design.abf;
- public interface IMobile {
- void call();
- }
- package org.test.design.abf;
- public interface IComputer {
- void play();
- }
具体产品类 Pad3 PadMini Phone4s Phone5
- package org.test.design.abf;
- public class Pad3 implements IComputer{
- public void play() {
- System.out.println("I am iPad3.");
- }
- }
- package org.test.design.abf;
- public class PadMini implements IComputer{
- public void play() {
- System.out.println("I am iPad Mini.");
- }
- }
- package org.test.design.abf;
- public class Phone4s implements IMobile {
- public void call() {
- System.out.println("I am IPhone 4s.");
- }
- }
- package org.test.design.abf;
- public class Phone5 implements IMobile {
- public void call() {
- System.out.println("I am IPhone 5.");
- }
- }
测试:
- package org.test.design.abf;
- public class TestMain {
- /**
- * @param args
- */
- public static void main(String[] args) {
- IAppleFactroy factory2011=new AppleFactoryIn2011();
- IComputer ipad3=factory2011.createComputer();
- ipad3.play();
- IMobile iphone4s=factory2011.createMobile();
- iphone4s.call();
- IAppleFactroy factory2012=new AppleFactoryIn2012();
- IComputer ipad_mini=factory2012.createComputer();
- ipad_mini.play();
- IMobile iphone5=factory2012.createMobile();
- iphone5.call();
- }
- }
- /*打印
- I am iPad3.
- I am IPhone 4s.
- I am iPad Mini.
- I am IPhone 5.
- **/
- 工厂设计模式 factory
- [设计模式]Factory工厂模式
- 设计模式--工厂模式Factory
- 设计模式 -- 工厂模式(Factory)
- 设计模式--工厂模式Factory
- 设计模式 - Factory工厂模式
- 工厂设计模式(Factory Pattern)
- Java设计模式:Factory(工厂模式)
- 设计模式之Factory工厂模式
- 设计模式(1)-工厂模式(Factory)
- 设计模式(1)-工厂模式(Factory)
- 设计模式之工厂模式Factory
- DAO设计模式+工厂模式(Factory)
- 设计模式之Factory工厂模式
- java设计模式之工厂模式(Factory)
- 设计模式之--工厂模式(Factory)
- 设计模式之工厂模式(Factory)
- 设计模式之工厂模式Factory
- 查找算法(二分查找、顺序统计(中值))
- 套接字(二):Socket 套接字编程(附实例)
- Android SDcard目录文件操作
- EF Code First学习笔记 初识Code First
- java中内部类的访问调用
- 工厂设计模式 factory
- AIDL的实现
- Android入门(1)- ListView学习
- 哈希表
- ajax 返回失败
- 使用Pspice进行电路仿真
- c++学习笔记之运算符重载与智能指针
- UVa 11987 - Almost Union-Find (并查集 需要一点技巧)
- OpenCV基础篇之图片叠加