网站首页 > java教程 正文
《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言,希望大家以后关注本头条号更多的内容。
工厂设计模式属于创建型模式。
创建型模式(Creational Pattern)关注对象的创建过程;创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节;创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
一、简单工厂设计模式
1、简单工厂模式优点:
(1)实现了对象创建和使用的分离
(2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
2、简单工厂模式缺点:
(1)工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
(2)增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度
(3)系统扩展困难,一旦添加新产品不得不修改工厂逻辑
示例:
public interface ICar {
public void run();
}
public class Ford implements ICar {
public void run(){
System.out.println("Ford开始启动了。。。。。");
}
}
public class Benz implements ICar {
public void run(){
System.out.println("Benz开始启动了。。。。。");
}
}
public class CarFactory {
public static ICar getCarInstance(String type){
ICar c=null;
if("Benz".equals(type)){
c=new Benz();
}
if("Ford".equals(type)){
c=new Ford();
}
return c;
}
}
public class FactoryDemo03 {
public static void main(String[] args) {
ICar c=CarFactory.getCarInstance("Benz");
if(c!=null){
c.run();
}else{
System.out.println("造不了这种汽车。。。");
}
}
}
3、在以下情况下可以使用简单工厂模式:
(1)工厂类负责创建的对象比较少:
由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
(2)客户端只知道传入工厂类的参数,对于如何创建对象不关心:
客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数
二、工厂方法模式
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
Product:抽象产品
ConcreteProduct:具体产品
Factory:抽象工厂
ConcreteFactory:具体工厂
(1)工厂方法模式是简单工厂模式的进一步抽象和推广
(2)工厂方法模式保持了简单工厂模式的优点,并克服了它的缺点
(3)核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给其子类去完成
(4)可以允许系统在不修改工厂角色的情况下引进新产品,符合开闭原则
示例:
为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海信电视机,如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。
public interface TVFactory
{
public TV produceTV();
}
public interface TV
{
public void play();
}
public class HaierTVFactory implements TVFactory
{
public TV produceTV()
{
System.out.println("海尔电视机工厂生产海尔电视机。");
return new HaierTV();
}
}
public class HisenseTVFactory implements TVFactory
{
public TV produceTV()
{
System.out.println("海信电视机工厂生产海信电视机。");
return new HisenseTV();
}
}
public class HaierTV implements TV
{
public void play()
{
System.out.println("海尔电视机播放中......");
}
}
public class HisenseTV implements TV
{
public void play()
{
System.out.println("海信电视机播放中......");
}
}
public static void main(String args[])
{
TVFactory factory = new HisenseTVFactory();
TV tv=factory.produceTV();
tv.play();
}
三、抽象工厂模式
在研究抽象工厂模式之前,先了解两个概念:
1、产品等级结构:
产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
2、产品族:
在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
AbstractProduct:抽象产品
ConcreteProduct:具体产品
示例:
一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景。
package com.test;
public class A001 {
public static void main(String[] args) {
AirConditioner ac;
EFactory factory=new HaierFactory();
Television tv=factory.produceTelevision();
tv.play();
ac=factory.produceAirConditioner();
ac.changeTemperature();
}
}
interface Television
{
public void play();
}
interface AirConditioner
{
public void changeTemperature();
}
interface EFactory
{
public Television produceTelevision();
public AirConditioner produceAirConditioner();
}
class HaierTelevision implements Television
{
public void play()
{
System.out.println("海尔电视机播放中......");
}
}
class TCLTelevision implements Television
{
public void play()
{
System.out.println("TCL电视机播放中......");
}
}
class HairAirConditioner implements AirConditioner
{
public void changeTemperature()
{
System.out.println("海尔空调温度改变中......");
}
}
class TCLAirConditioner implements AirConditioner
{
public void changeTemperature()
{
System.out.println("TCL空调温度改变中......");
}
}
class HaierFactory implements EFactory
{
public Television produceTelevision()
{
return new HaierTelevision();
}
public AirConditioner produceAirConditioner()
{
return new HairAirConditioner();
}
}
class TCLFactory implements EFactory
{
public Television produceTelevision()
{
return new TCLTelevision();
}
public AirConditioner produceAirConditioner()
{
return new TCLAirConditioner();
}
}
在以下情况下可以使用抽象工厂模式:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节
2、系统中有多于一个的产品族,但每次只使用其中某一产品族
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来
4、产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构
猜你喜欢
- 2024-10-23 Java的简单工厂模式(java简单工厂模式实验总结)
- 2024-10-23 Java开发篇——设计模式(3)面试被问工厂模式?不要怕看这里
- 2024-10-23 架构师成长之路:Java设计模式之工厂模式
- 2024-10-23 Java的设计模式(十一):三种工厂模式区别,SpringBoot中的运用
- 2024-10-23 Java——工厂方法模式(java的工厂模式是什么意思啊)
- 2024-10-23 Java编程细节——设计模式之工厂模式
- 2024-10-23 Java之工厂方法(Factory Method)(java工厂模式的应用场景)
- 2024-10-23 教你轻松学Java开发23种设计模式 --工厂设计模式
- 2024-10-23 java设计模式-创建者模式-工厂模式
- 2024-10-23 设计模式——工厂方法模式(工厂设计模式的优点)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)