Java—工厂模式
一个人,要买一个手机 他去了京东上买手机, 有两款手机 HUWEI mate20 和iPhoneXS,与是出现了一下的场景
interface Phone{//定义一个手机类
void isPhone();
}
class Mate20 implements Phone{
public void isPhone(){//具体的手机
System.out.println("HUAWEI mate 20");
}
}
class IphoneXS implements Phone{
public void isPhone(){//具体的手机
System.out.println("Iphone XS");
}
}
class Client{
public void buyPhone(Phone phone){//客户类
phone.isPhone();
}
}
public class Day20{
public static void main(String[] args){
Client client = new Client();
client.buyPhone(new Mate20());
}
}
上面的方法 ,一旦你要再加上别的手机 比如新上里一款三星的手机,你想要购买,你就要在主程序里修改你要买的商品 ,这显然是不现实的 所以我们引出
###简单工厂模式
- 一个抽象产品接口
2.多个具体产品类
3.一个工厂类
import java.util.Scanner;
interface Phone{//抽象产品接口
void isPhone();
}
//具体产品接口
class Mate20 implements Phone{
public void isPhone(){
System.out.println("HUAWEI mate 20");
}
}
class IphoneXS implements Phone{
public void isPhone(){
System.out.println("Iphone XS");
}
}
//工厂类
class phoneFactory{
public static Phone creatPhone(String type){
if(type.equals("Mate20")){
return new Mate20();
}else if(type.equals("Iphone XS")){
return new IphoneXS();
}
return null;
}
}
class Client{
public void buyPhone(Phone phone){
phone.isPhone();
}
}
public class Day20{
public static void main(String[] args){
Client client =new Client();
Scanner scanner= new Scanner(System.in);
System.out.println("请选择型号");
String type=scanner.nextLine();
client.buyPhone(phoneFactory.creatPhone(type));
}
}
上述代码,通过手动输入型号将类的实例化交给工厂, 每当有一个新产品时给不用修改主程序,只需要修改工厂类即可,但是 这样做依旧违反OCP(开闭原则)
工厂方法模式
1.一个抽象产品接口
2.多个具体产品类
3.一个抽象工厂接口
4.多个具体工厂类
在上面简单工厂模式中,所有手机在一个工厂里生产 ,但是在现实中这是不可能出现的,所以不同品牌的手机应该在不同品牌的工厂里生产
在现实生活中,工厂是一个抽象的概念,所以 各自品牌的工厂实现这个抽象工厂接口
interface Phone{
void isPhone();
}
class Mate20 implements Phone{
public void isPhone(){
System.out.println("HUAWEI mate 20");
}
}
class IphoneXS implements Phone{
public void isPhone(){
System.out.println("Iphone XS");
}
}
//定义了一个工厂
interface PhoneFactory{
Phone creatPhone();
}
//不同品牌实现这个
class HUAWEIFactory implements PhoneFactory{
public Phone creatPhone(){
return new Mate20();
}
}
class AppleFactory implements PhoneFactory{
public Phone creatPhone(){
return new IphoneXS();
}
}
class Client{
public void buyPhone(Phone phone){
phone.isPhone();
}
}
class Day20{
public static void main(String[] args){
Client client = new Client();
client.buyPhone(new AppleFactory().creatPhone());
}
}
这样做,每次有一个型产品时只需要实现工厂类即可 ,不用修改代码,只需要扩展即可
优点:降低了代码的耦合度,对象生成交给子类去完成
实现了开放封闭原则—每次添加子产品不需要修改源代码
缺点:增加了代码量,每个具体产品都要一个具体的工厂
抽象方法模式
在现实生活中,一个手机当然是需要操作系统的吧 ! 一个工厂也不可能只会生产手机
抽象方法模式就是解决一个具体工厂会生产多个产品的情况
1.多个抽象产品接口
2.多个具体产品类
3.一个抽象工厂类——定义多个抽象放啊
4.多个具体工厂类
interface Phone{//第一个抽象产品类
void isPhone();
}
class Mate20 implements Phone{
public void isPhone(){
System.out.println("HUAWEI mate 20");
}
}
class IphoneXS implements Phone{//
public void isPhone(){
System.out.println("Iphone XS");
}
}
interface OperatingSystem{//第二个具体产品类
void isOperatingSystem();
}
class Android implements OperatingSystem{
public void isOperatingSystem(){
System.out.println("安卓操作系统");
}
}
class IOS implements OperatingSystem{
public void isOperatingSystem(){
System.out.println("IOS操作系统");
}
}
interface PhoneFactory{//工厂接口有多个返回值为类对象的抽象方法
Phone creatPhone();
OperatingSystem creatOperating();
}
class HUAWEIFactory implements PhoneFactory{
public Phone creatPhone(){
return new Mate20();
}
public OperatingSystem creatOperating(){
return new Android();
}
}
class AppleFactory implements PhoneFactory{
public Phone creatPhone(){
return new IphoneXS();
}
public OperatingSystem creatOperating(){
return new IOS();
}
}
class Client{//客户端类
public void buyPhone(Phone phone){
phone.isPhone();
}
public void usePhone(OperatingSystem use){
use.isOperatingSystem();
}
public static void main(String[] args){
Client client=new Client();
AppleFactory iphone= new AppleFactory() ;
client.buyPhone(iphone.creatPhone());
client.usePhone(iphone.creatOperating());
}
}