博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂模式
阅读量:5733 次
发布时间:2019-06-18

本文共 3070 字,大约阅读时间需要 10 分钟。

hot3.png

简述

  1. 简单工厂模式: 由一个具体的工厂实例类根据调用传入标识来判定创建产品抽象类的不同实例。
  2. 工厂方法模式: 多个工厂实例类继承实现同一个工厂抽象,工厂抽象类只有单一产品抽象, 调用时由调用方选择实例化指定的工厂实例类来创建不同的产品实例
  3. 抽象工厂模式:   工厂模式的基础上增加另外的多个不同的产品抽象,工厂中含有多个不同产品抽象的实例方法。

 

简单工厂模式

又称静态工厂方法模式

  1. 工厂实例角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。
  2. 产品抽象角色:它一般是具体产品继承的父类或者实现的接口。
  3. 产品实例角色:工厂实例所创建的对象就是此角色的实例,由一个具体类实现。
public class SimpleNoodlesFactory {    public static final int TYPE_LZ = 1;//兰州拉面    public static final int TYPE_PM = 2;//泡面    public static final int TYPE_GK = 3;//干扣面    public static INoodles createNoodles(int type) {        switch (type) {            case TYPE_LZ:                return new LzNoodles();            case TYPE_PM:                return new PaoNoodles();            case TYPE_GK:            default:                return new GankouNoodles();        }    }}

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的逻辑判断可以由工厂方法模式里不同的工厂子类来分担, 调用方调用时选择实例具体工厂。

  1. 一个产品抽象,可以派生出多个具体产品类。
  2. 一个工厂抽象,可以派生出多个具体工厂类。
  3. 每个具体工厂实例只能创建一个具体产品类的实例。
/*抽象工厂*/public abstract class NoodlesFactory {    public abstract INoodles create();}
/*实例工厂A*/public class LzFactory extends NoodlesFactory {    @Override    public INoodles create() {        return new LzNoodles();    }}/*实例工厂B*/public class PaoFactory extends NoodlesFactory {    @Override    public INoodles create() {        return new PaoNoodles();    }}/*调用时指定实例化工厂对象*/        NoodlesFactory factory = new GankouFactory();        INoodles entity = factory .create();        entity .desc();

抽象工厂模式

  1. 多个产品抽象,每个产品抽象可以派生出多个产品抽象实例。   
  2. 一个抽象工厂,可以派生出多个具体工厂实例。
  3. 每个具体工厂实例可以创建多个产品(簇)抽象的实例。

相同:

     都只有一个工厂抽象。

区别:

  1. 工厂方法模式只有一个产品抽象,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂实例类只能创建一个产品抽象的实例,而抽象工厂模式可以创建不同产品抽象的实例。
/*产品抽象*/public abstract class IDrinks {        public abstract void prices();}/*产品实例*/public class ColaDrinks extends IDrinks {    @Override    public void prices() {        System.out.println("可乐三块五");    }}/*产品实例*/public class WaterDrinks extends IDrinks {    @Override    public void prices() {        System.out.println("和我一样的穷鬼都喝水,不要钱~!");    }}/*工厂抽象*/public abstract class AbstractFoodFactory {    /**     * 生产面条     *     * @return     */    public abstract INoodles createNoodles();    /**     * 生产饮料     */    public abstract IDrinks createDrinks();}/*工厂实例*/public class LzlmFoodFactory extends AbstractFoodFactory {    @Override    public INoodles createNoodles() {        return new LzNoodles();//卖兰州拉面    }    @Override    public IDrinks createDrinks() {        return new WaterDrinks();//卖水    }}/*工厂实例*/public class KFCFoodFactory extends AbstractFoodFactory {    @Override    public INoodles createNoodles() {        return new PaoNoodles();//KFC居然卖泡面    }    @Override    public IDrinks createDrinks() {        return new ColaDrinks();//卖可乐    }} /*使用*/            AbstractFoodFactory abstractFoodFactory1 = new KFCFoodFactory();        abstractFoodFactory1.createDrinks().prices();        abstractFoodFactory1.createNoodles().desc();        abstractFoodFactory1= new LzlmFoodFactory();        abstractFoodFactory1.createDrinks().prices();        abstractFoodFactory1.createNoodles().desc();

 

转载于:https://my.oschina.net/u/3434392/blog/2208788

你可能感兴趣的文章
C语言入门基础之数组——数学和编程的完美结合(图)
查看>>
《远见》的读后感作文1000字范文
查看>>
重置密码、单用户模式、救援模式
查看>>
LAMP环境搭建1-mysql5.5
查看>>
第三课 Linux目录及文件管理、用户组管理及bash重定向
查看>>
shell 脚本攻略--小试牛刀
查看>>
spring boot view override
查看>>
bzoj 2282: [Sdoi2011]消防
查看>>
我的友情链接
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>
关于C#面向对象2
查看>>
Javascript String类的属性及方法
查看>>
vim编辑器如何添加或删除多行注释
查看>>
[LeetCode] Merge Intervals
查看>>
iOS开发-按钮的基本使用
查看>>
在QT和SDL搭建的框架中使用OPENGL在SDL窗口上进行绘图
查看>>
REST技术第三步 @BeanParam的使用
查看>>
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
Python中的对象行为与特殊方法(二)类型检查与抽象基类
查看>>
使用 axios 详解
查看>>