zoukankan      html  css  js  c++  java
  • Factory Pattern模式(简单工厂、工厂方法、抽象工厂模式)

    与工厂相关的的三个设计模式 2020-11-08 15:03:29

    简单工厂模式:说白就是,间接脱离了new 创建对象,而是直接从工厂中获得对象。

    简单工厂:不是用new创建对象,而是将创建对象这一过程集中放在了工厂中,这样便于维护修改创建过程;也实现了调用创建对象和对象之间的解耦。

    话不多说,先了解一下如下UML类图:

                    

    汽车类
    package com.yuan.factory.simple;

    public abstract class Car {

    public abstract void getname();

    }

    大众汽车类
    package com.yuan.factory.simple;

    public class Dazong extends Car {

    @Override
    public void getname() {
    System.out.println("大众");
    }
    }

    特斯拉汽车类
    package com.yuan.factory.simple;

    public class Tsla extends Car {
    @Override
    public void getname() {
    System.out.println("特斯拉");
    }
    }

    汽车工厂类
    package com.yuan.factory.simple;

    public class CarFactory {

    public static Car getTsla(){
    return new Tsla();
    }


    public static Car getDazong(){
    return new Dazong();
    }

    }

    客户类
    package com.yuan.factory.simple;

    public class Customer {
    public static void main(String[] args) {
    CarFactory carFactory = new CarFactory();
    carFactory.getTsla().getname();
    carFactory.getDazong().getname();
    }
    }

    工厂方法模式

      由于简单工厂模式,不满足“对扩展开放,对修改关闭”原则,所以说,就出现了工厂方法模式。那么工厂方法模式就是在简单工厂模式上,对每个子类建立一个工厂,因此实现扩展性,遵循上述原则。

    汽车接口
    package com.yuan.factory.method;


    public interface Car {

    void getname();
    }

    大众汽车类
    package com.yuan.factory.method;

    public class Dazong implements Car {
    @Override
    public void getname() {
    System.out.println("大众");
    }
    }
    特斯拉汽车类
    package com.yuan.factory.method;

    public class Tsla implements Car {
    @Override
    public void getname() {
    System.out.println("特斯拉");
    }
    }

    汽车工厂接口
    package com.yuan.factory.method;

    public interface CarFactory {

    Car getCar();
    }
    大众汽车工厂
    package com.yuan.factory.method;

    public class DazongFactory implements CarFactory {


    @Override
    public Car getCar() {
    return new Dazong();
    }
    }

    特斯拉汽车工厂
    package com.yuan.factory.method;

    public class TslaFactory implements CarFactory{

    @Override
    public Car getCar() {
    return new Tsla();
    }
    }

    客户类
    package com.yuan.factory.method;

    public class Customer {

    public static void main(String[] args) {
    new DazongFactory().getCar().getname();
    new TslaFactory().getCar().getname();
    }
    }


    抽象工厂模式

    产品族:由同一家产品生产厂家生产的不同类型产品。

    同一产品类型:略...略...略

        抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

        在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    先了解一些第一张UML图:

     请仔细看这个UML类图:如下图。产品工厂生产其他子工厂:华为工厂和小米工厂。Demo测试用类直接使用子工厂。

    在此图中抽象工厂就是管理其他子工厂,是子工厂的进一步抽象。

                          

    抽象工厂类
    package com.yuan.factory.abstract1;
    //抽象产品工厂
    public interface IProductFactory {

    //生产手机
    IphoneProduct iPhoneProduct();
    //生产路由器
    IRouterProduct iRouterProduct();

    }

    抽象工厂子工厂:
    1.华为工厂类
      
    package com.yuan.factory.abstract1;

    /**
    * 华为抽象工厂 华为产品族
    */
    public class HUAWeiFactory implements IProductFactory {
    @Override
    public IphoneProduct iPhoneProduct() {
    return new HuaweiPhone();
    }

    @Override
    public IRouterProduct iRouterProduct() {
    return new HuaweiRouter();
    }
    }

    2.小米工厂类
    package com.yuan.factory.abstract1;

    /**
    * 小米的抽象工厂
    */
    public class XiaomiFactory implements IProductFactory {
    @Override
    public IphoneProduct iPhoneProduct() {
    return new XiaomiPhone();
    }

    @Override
    public IRouterProduct iRouterProduct() {
    return new XiaomiRouter();
    }
    }


    手机接口
    package com.yuan.factory.abstract1;

    //手机产品接口
    public interface IphoneProduct {

    void start();
    void shutdown();
    void callup();
    void sendMessage();
    }

    路由器接口
    package com.yuan.factory.abstract1;

    //路由器
    public interface IRouterProduct {

    void start();
    void shutdown();
    void openWifi();
    void setting();
    }

    手机实现类:
    1.华为手机类
    package com.yuan.factory.abstract1;
    //华为手机
    public class HuaweiPhone implements IphoneProduct{


    @Override
    public void start() {
    System.out.println("开启华为手机");
    }

    @Override
    public void shutdown() {
    System.out.println("关闭华为手机");
    }

    @Override
    public void callup() {
    System.out.println("华为手机打电话");
    }

    @Override
    public void sendMessage() {
    System.out.println("华为手机发短信");
    }
    }

    2.小米手机类
    package com.yuan.factory.abstract1;
    //小米手机
    public class XiaomiPhone implements IphoneProduct{


    @Override
    public void start() {
    System.out.println("开启小米手机");
    }

    @Override
    public void shutdown() {
    System.out.println("关闭小米手机");
    }

    @Override
    public void callup() {
    System.out.println("小米打电话");
    }

    @Override
    public void sendMessage() {
    System.out.println("小米发短信");
    }
    }

    路由器实现类
    1.华为路由器
    package com.yuan.factory.abstract1;

    public class HuaweiRouter implements IRouterProduct {
    @Override
    public void start() {
    System.out.println("华为路由器开启");
    }

    @Override
    public void shutdown() {
    System.out.println("华为路由器关闭");
    }

    @Override
    public void openWifi() {
    System.out.println("打开华为wifi");
    }

    @Override
    public void setting() {
    System.out.println("配置华为路由器");
    }
    }

    2.小米路由器
    package com.yuan.factory.abstract1;

    public class XiaomiRouter implements IRouterProduct {
    @Override
    public void start() {
    System.out.println("小米路由器打开");
    }

    @Override
    public void shutdown() {
    System.out.println("小米路由器关闭");
    }

    @Override
    public void openWifi() {
    System.out.println("打开小米wifi");
    }

    @Override
    public void setting() {
    System.out.println("配置小米路由器");
    }
    }

      

    无不读书神仙,有打瞌睡豪杰。
  • 相关阅读:
    Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)
    Deep Learning 之 最优化方法
    2018校招笔试真题汇总
    Java Swing 图形界面开发(目录)
    【目录】Spring 源码学习
    【剑指Offer学习】【所有面试题汇总】
    SSM框架学习思维导图
    关于P2P架构的网络游戏
    Styling FX Buttons with CSS
    JavaFx2.0中CSS的应用
  • 原文地址:https://www.cnblogs.com/TreasureBoy-blog/p/13946384.html
Copyright © 2011-2022 走看看