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("配置小米路由器");
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2020-11-08 23:10  乐酷yuan  阅读(136)  评论(0编辑  收藏  举报