23种设计模式_MODE03抽象工厂模式_手写代码实现

简介: 23种设计模式_MODE03抽象工厂模式_手写代码实现

1.抽象工厂测试 == 具体工厂类实现不同电脑组件的生产

package com.zhaoshuangjian.mode03_抽象工厂模式;
import com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory.LianXiang01Factory;
import com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory.LianXiang02Factory;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
 * <p>抽象工厂测试 == 具体工厂类实现不同电脑组件的生产</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 *
 *
 * 工厂方法模式:
 * 一个抽象产品类,可以派生出多个具体产品类。
 * 一个抽象工厂类,可以派生出多个具体工厂类。
 * 每个具体工厂类只能创建一个具体产品类的实例。
 *
 * 抽象工厂模式:
 * 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
 * 一个抽象工厂类,可以派生出多个具体工厂类。
 * 每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。
 *
 * 区别:
 * 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
 * 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
 * =====================================================================
 * 工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,
 * 你的代码很可能大部分都放在了产品的构造和初始化这些细节上面。也因为如此,
 * 类似的产品之间有很多可以复用的特征,所以会和模版方法相随。
 *
 * 抽象工厂需要创建一系列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,
 * 你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。
 *
 */
public class AbstractFactoryTest {
    public static void main(String[] args) {
        // 用户需要购买联想的电脑,但要求键盘和鼠标都是雷柏的,于是便找到了对应的01电脑组装工厂进行生产
        LianXiang01Factory lianXiang01Factory = new LianXiang01Factory();
        ProduceKeyBord keybord1 = lianXiang01Factory.createKeyBord();
        keybord1.produceKeyBord("M550", "黑色");
        ProduceMouse Mouse1 = lianXiang01Factory.createMouse();
        Mouse1.produceMouse("M590", "有线");
        System.out.println("=======================分割线,注意区别");
        // 用户需要购买联想的电脑,但要求键盘是雷柏的,鼠标是罗技的,于是便找到了对应的02电脑组装工厂进行生产
        LianXiang02Factory lianXiang02Factory = new LianXiang02Factory();
        ProduceKeyBord keybord2 = lianXiang02Factory.createKeyBord();
        keybord2.produceKeyBord("M550", "黑色");
        ProduceMouse Mouse2 = lianXiang02Factory.createMouse();
        Mouse2.produceMouse("M590", "无线");
        /**
         * 好处:横向扩展很容易,如果我需要再增加一个电脑型号的生产线,比如HP【惠普】,只需要在创建一个对应的工厂实现抽象工厂即可
         * 坏处:纵向扩展很麻烦,如果我需要增加显示器的生产接口,那么改动的地方就太多了,自己领会吧,可以尝试一下
         */
    }
}

2.联想电脑生产商 == 电脑型号01【固定键盘和鼠标生产商】

package com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard.LeiBoKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.Mouse.LeiBoMouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ComputerAbstractFactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
 * <p>联想电脑生产商 == 电脑型号01【固定键盘和鼠标生产商】</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public class LianXiang01Factory implements ComputerAbstractFactory {
    @Override
    public ProduceKeyBord createKeyBord() {
        // 使用雷柏的键盘
        return new LeiBoKeyBord();
    }
    @Override
    public ProduceMouse createMouse() {
        // 使用雷柏的鼠标
        return new LeiBoMouse();
    }
}

3.联想电脑生产商 == 电脑型号:02【固定键盘和鼠标生产商】

package com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard.LeiBoKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.Mouse.LuoJiMouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ComputerAbstractFactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
 * <p>联想电脑生产商 == 电脑型号:02【固定键盘和鼠标生产商】</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public class LianXiang02Factory implements ComputerAbstractFactory {
    @Override
    public ProduceKeyBord createKeyBord() {
        // 使用雷柏的键盘
        return new LeiBoKeyBord();
    }
    @Override
    public ProduceMouse createMouse() {
        // 使用罗技的鼠标
        return new LuoJiMouse();
    }
}

4.雷柏(Rapoo)键盘生产商

package com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
/**
 * <p>雷柏(Rapoo)键盘生产商</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public class LeiBoKeyBord implements ProduceKeyBord {
    @Override
    public void produceKeyBord(String name, String color) {
        System.out.println("雷柏键盘 -- "+name+","+color);
    }
}

5.罗技(G)键盘生产商

package com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
/**
 * <p>罗技(G)键盘生产商</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public class LuoJiKeyBord implements ProduceKeyBord {
    @Override
    public void produceKeyBord(String name, String color) {
        System.out.println("罗技键盘 -- "+name+","+color);
    }
}

6.computer抽象工厂接口-只提供电脑组件的组装,具体组装成什么样的型号的电脑,再由具体工厂类决定

package com.zhaoshuangjian.mode03_抽象工厂模式.mode03;
/**
 * computer抽象工厂接口-只提供电脑组件的组装,具体组装成什么样的型号的电脑,再由具体工厂类决定
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午1:37
 */
public abstract interface ComputerAbstractFactory {
    ProduceKeyBord createKeyBord();
    ProduceMouse createMouse();
}

7.键盘接口 – 生产键盘

package com.zhaoshuangjian.mode03_抽象工厂模式.mode03;
/**
 * <p>键盘接口 -- 生产键盘 </p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public interface ProduceKeyBord {
    /**
     * 约定键盘生产的规格数据
     * @param name  名称
     * @param color 颜色
     */
    public void produceKeyBord(String name,String color);
}

8.鼠标接口 – 生产鼠标

package com.zhaoshuangjian.mode03_抽象工厂模式.mode03;
/**
 * <p>鼠标接口 -- 生产鼠标</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
     public interface ProduceMouse {
     /**
     * 约定鼠标生产的规格数据
     * @param name 名称
     * @param type 类型
     */
    public  void produceMouse(String name,String type);
}

9.雷柏(Rapoo)鼠标生产商

package com.zhaoshuangjian.mode03_抽象工厂模式.Mouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
 * <p>雷柏(Rapoo)鼠标生产商</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public class LeiBoMouse implements ProduceMouse {
    @Override
    public void produceMouse(String name, String type) {
        System.out.println("雷柏鼠标 -- "+name+","+type);
    }
}

10.罗技(G)鼠标生产商

package com.zhaoshuangjian.mode03_抽象工厂模式.Mouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
 * <p>罗技(G)鼠标生产商</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午1:37
 */
public class LuoJiMouse implements ProduceMouse {
    @Override
    public void produceMouse(String name, String type) {
        System.out.println("罗技鼠标 -- "+name+","+type);
    }
}
相关文章
|
1月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
28 0
|
1月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
|
1月前
|
设计模式 缓存 安全
代码的艺术:如何用设计模式打造优雅的Java应用
【4月更文挑战第7天】本文介绍了提升Java代码质量的七个设计模式:单例(Singleton)、工厂方法、抽象工厂、建造者、原型、适配器和观察者模式。这些模式分别用于资源管理、对象创建、接口兼容和消息传递等场景,旨在增强代码的灵活性、可读性和可维护性。掌握并适时应用设计模式,能帮助开发者打造高效、优雅的软件作品。
|
1月前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
37 4
|
21天前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
110 4
|
5天前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
17天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
1月前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
19 2
|
1月前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
20 0
|
1月前
|
设计模式 算法 搜索推荐
23种设计模式,策略模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】设计模式是软件工程中的一种最佳实践指导,用于解决常见的设计问题。它们被分类为创建型、结构型和行为型模式。其中,策略模式是一种行为型设计模式,旨在定义一系列算法,封装每一个算法,并使它们可互换。策略模式允许算法独立于使用它们的客户端变化
22 1