05—工厂方法模式

factory method模式:模板方法模式+简单工厂模式,简单工厂模式稍微复杂一点的变种

场景:

(1)我们现在要生产的产品有多种(2)每种产品的生产过程,都有一些是共同的逻辑,但是也有一些是特殊的逻辑(3)现在要生产出来各种产品

1、不使用工厂方法模式

/**
 * 不使用设计模式
 */
public class WithoutFactoryMethodPatternDemo {
    /**
     * 问题在哪儿?
     * 跟模板方法模式的问题一样
     * 就是多个工厂类中,有生产产品的相同的通用逻辑,没有抽取出来,
     * 直接复制粘贴放在多个工厂里了
     * 如果那段通用逻辑要修改
     * 就需要很麻烦到所有工厂中去修改代码,可能会忘记修改了某个工厂的代码
     */
    public static void main(String[] args) {

        Product product1 = Product1Factory.creatProduct();
        product1.execute();

        Product product2 = Product2Factory.creatProduct();
        product2.execute();

        Product product3 = Product3Factory.creatProduct();
        product3.execute();
    }

       // 产品接口类
    public interface Product{
        void execute();
    }
       // 产品接口实现类1
    public static class Product1 implements Product{
        @Override
        public void execute() {
            System.out.println("产品1的功能逻辑");
        }
    }
       // 产品接口实现类2
    public static class Product2 implements Product{
        @Override
        public void execute() {
            System.out.println("产品2的功能逻辑");
        }
    }
       // 产品接口实现类3
    public static class Product3 implements Product{
        @Override
        public void execute() {
            System.out.println("产品2的功能逻辑");
        }
    }
       // 工厂类1
    public static class Product1Factory{
        public static Product createProduct(){
            System.out.println("生产产品的通用逻辑");
            System.out.println("生产产品1的特殊逻辑");
            return new Product1();
        }
    }
       // 工厂类2
    public static class Product2Factory{
        public static Product createProduct(){
            System.out.println("生产产品的通用逻辑");
            System.out.println("生产产品 2 的特殊逻辑");
            return new Product2();
        }
    }
       //工厂类3
    public static class Product3Factory{
        public static Product createProduct(){
            System.out.println("生产产品的通用逻辑");
            System.out.println("生产产品 3 的特殊逻辑");
            return new Product3();
        }
    }
}

2、使用工厂方法模式

/**
 * 使用工厂方法设计模式
 */
public class FactoryMethodPatternDemo {

       // 主函数
    public static void main(String[] args) {
        Product product1 = Product1Factory.get().createProduct();
        Product product2 = Product2Factory.get().createProduct();
        Product product3 = Product3Factory.get().createProduct();
    }

        // 产品接口
    public interface Product{
        void execute();
    }

       // 产品接口实现类1
    public static class Product1 implements Product {
        @Override
        public void execute() {
            System.out.println("产品1的功能逻辑");
        }
    }

       // 产品接口实现类2
    public static class Product2 implements Product {
        @Override
        public void execute() {
            System.out.println("产品2的功能逻辑");
        }
    }

       // 产品接口实现类3
    public static class Product3 implements Product {
        @Override
        public void execute() {
            System.out.println("产品2的功能逻辑");
        }
    }

    // 抽象工厂
    public static abstract class AbstractProductFactory{

        public Product createProduct(){
            commonCreate();
            return specificCreate();
        }

        private void commonCreate() {
            System.out.println("生厂产品通用的步骤");
        }

        protected abstract Product specificCreate();
    }

        // 抽象工厂子类1
    public static class Product1Factory extends AbstractProductFactory{

        private static Product1Factory instance =new Product1Factory();

        private Product1Factory() {
           }

        public static Product1Factory get(){
            return instance;
           }

        @Override
        protected Product specificCreate() {
            System.out.println("生产产品1的特殊逻辑");
            return new Product1();
          }
    }

        // 抽象工厂子类2
    public static class Product2Factory extends AbstractProductFactory{

        private static Product2Factory instance =new Product2Factory();

        private Product2Factory() {
        }

        public static Product2Factory get(){
            return instance;
        }

        @Override
        protected Product specificCreate() {
            System.out.println("生产产品 2 的特殊逻辑");
            return new Product2();
        }
    }

        // 抽象工厂子类3
    public static class Product3Factory extends AbstractProductFactory{

        private static Product3Factory instance =new Product3Factory();

        private Product3Factory() {
        }

        public static Product3Factory get(){
            return instance;
        }

        @Override
        protected Product specificCreate() {
            System.out.println("生产产品 3 的特殊逻辑");
            return new Product3();
        }
    }
}

# 总结

说实话,这种设计模式算是较为复杂一点的了,适用的是比较复杂的场景了
一般就是在有复杂工厂生产场景的情况下,比如就是需要多种工厂生产不同的产品,但是产品都是类似的,同时不同的工厂有一定的相同逻辑,那么就用这种模式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 除非需求非常明确,通常一开始无法确定哪些地方需要通过设计模式来优化代码的组织,因此通常的做法是先根据当前需求编写简...
    蓝色信仰阅读 4,097评论 0 7
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,734评论 0 14
  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 1,309评论 0 7
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 1,177评论 1 9
  • 国庆八天长假已近尾声,今日寒凉突袭,夜雨敲窗,散漫的灯光下,回首因胃痛无法远行的一周: 十月一日 小南湖观八棱海棠...
    布谷鸟唐山阅读 245评论 0 1